WebGLã·ã§ãŒããŒããã°ã©ã ã®ãªã³ã¯ãšãã¬ã³ããªã³ã°ããã©ãŒãã³ã¹ãæé©åããããã®ãã«ãã·ã§ãŒããŒããã°ã©ã ã¢ã»ã³ããªæè¡ã«ã€ããŠã®è©³çްãªè§£èª¬ã
WebGLã·ã§ãŒããŒããã°ã©ã ã®ãªã³ã¯ïŒãã«ãã·ã§ãŒããŒããã°ã©ã ã¢ã»ã³ããª
WebGLã¯ãã¬ã³ããªã³ã°æäœãå®è¡ããããã«ã·ã§ãŒããŒã«å€§ããäŸåããŠããŸããã·ã§ãŒããŒããã°ã©ã ãã©ã®ããã«äœæããããªã³ã¯ãããããçè§£ããããšã¯ãããã©ãŒãã³ã¹ãæé©åããè€éãªèŠèŠå¹æãäœæããããã«äžå¯æ¬ ã§ãããã®èšäºã§ã¯ãWebGLã·ã§ãŒããŒããã°ã©ã ã®ãªã³ã¯ã®è€éããæ¢ããç¹ã«ã·ã§ãŒããŒããã°ã©ã ãå¹ççã«åãæ¿ããããã®æè¡ã§ãããã«ãã·ã§ãŒããŒããã°ã©ã ã¢ã»ã³ããªã«çŠç¹ãåœãŠãŸãã
WebGLã¬ã³ããªã³ã°ãã€ãã©ã€ã³ãçè§£ãã
ã·ã§ãŒããŒããã°ã©ã ã®ãªã³ã¯ã«ã€ããŠè©³ããèŠãåã«ãåºæ¬çãªWebGLã¬ã³ããªã³ã°ãã€ãã©ã€ã³ãçè§£ããããšãéèŠã§ãããã€ãã©ã€ã³ã¯æŠå¿µçã«æ¬¡ã®ã¹ããŒãžã«åããããšãã§ããŸãïŒ
- é ç¹åŠçïŒ é ç¹ã·ã§ãŒããŒã¯3Dã¢ãã«ã®åé ç¹ãåŠçãããã®äœçœ®ã倿ããããä»ã®é ç¹å±æ§ã倿ŽãããããŸãã
- ã©ã¹ã¿ã©ã€ãºïŒ ãã®ã¹ããŒãžã§ã¯ãåŠçãããé ç¹ããã©ã°ã¡ã³ãïŒç»é¢ã«æç»ãããå¯èœæ§ã®ãããã¯ã»ã«ïŒã«å€æããŸãã
- ãã©ã°ã¡ã³ãåŠçïŒ ãã©ã°ã¡ã³ãã·ã§ãŒããŒã¯åãã©ã°ã¡ã³ãã®è²ã決å®ããŸããããã§ã©ã€ãã£ã³ã°ããã¯ã¹ãã£ãªã³ã°ããã®ä»ã®èŠèŠå¹æãé©çšãããŸãã
- ãã¬ãŒã ãããã¡æäœïŒ æçµã¹ããŒãžã§ã¯ããã©ã°ã¡ã³ãã®è²ããã¬ãŒã ãããã¡ã®æ¢åã®ã³ã³ãã³ããšçµã¿åããããã¬ã³ãã£ã³ã°ããã®ä»ã®æäœãé©çšããŠæçµçãªç»åãçæããŸãã
GLSLïŒOpenGL Shading LanguageïŒã§èšè¿°ãããã·ã§ãŒããŒã¯ãé ç¹ããã³ãã©ã°ã¡ã³ãåŠçã¹ããŒãžã®ããžãã¯ãå®çŸ©ããŸãããããã®ã·ã§ãŒããŒã¯ã³ã³ãã€ã«ãããã·ã§ãŒããŒããã°ã©ã ã«ãªã³ã¯ãããŠGPUã«ãã£ãŠå®è¡ãããŸãã
ã·ã§ãŒããŒã®äœæãšã³ã³ãã€ã«
ã·ã§ãŒããŒããã°ã©ã ãäœæããæåã®ã¹ãããã¯ãGLSLã§ã·ã§ãŒããŒã³ãŒããèšè¿°ããããšã§ãã以äžã¯é ç¹ã·ã§ãŒããŒã®ç°¡åãªäŸã§ãïŒ
#version 300 es
in vec4 a_position;
uniform mat4 u_modelViewProjectionMatrix;
void main() {
gl_Position = u_modelViewProjectionMatrix * a_position;
}
ãããŠã察å¿ãããã©ã°ã¡ã³ãã·ã§ãŒããŒã§ãïŒ
#version 300 es
precision highp float;
out vec4 fragColor;
void main() {
fragColor = vec4(1.0, 0.0, 0.0, 1.0); // Red
}
ãããã®ã·ã§ãŒããŒã¯ãGPUãçè§£ã§ãã圢åŒã«ã³ã³ãã€ã«ããå¿ èŠããããŸããWebGL APIã¯ãã·ã§ãŒããŒã®äœæãã³ã³ãã€ã«ããªã³ã¯ã®ããã®é¢æ°ãæäŸããŸãã
function createShader(gl, type, source) {
const shader = gl.createShader(type);
gl.shaderSource(shader, source);
gl.compileShader(shader);
if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
console.error('An error occurred compiling the shaders: ' + gl.getShaderInfoLog(shader));
gl.deleteShader(shader);
return null;
}
return shader;
}
const vertexShader = createShader(gl, gl.VERTEX_SHADER, vertexShaderSource);
const fragmentShader = createShader(gl, gl.FRAGMENT_SHADER, fragmentShaderSource);
ã·ã§ãŒããŒããã°ã©ã ã®ãªã³ã¯
ã·ã§ãŒããŒãã³ã³ãã€ã«ãããããããããã·ã§ãŒããŒããã°ã©ã ã«ãªã³ã¯ããå¿ èŠããããŸãããã®ããã»ã¹ã¯ãã³ã³ãã€ã«ãããã·ã§ãŒããŒãçµåãããããã®éã®äŸåé¢ä¿ã解決ããŸãããªã³ã¯ããã»ã¹ã§ã¯ãuniform倿°ãattributeã«ãã±ãŒã·ã§ã³ãå²ãåœãŠãããŸãã
function createProgram(gl, vertexShader, fragmentShader) {
const program = gl.createProgram();
gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);
gl.linkProgram(program);
if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
console.error('Unable to initialize the shader program: ' + gl.getProgramInfoLog(program));
return null;
}
return program;
}
const shaderProgram = createProgram(gl, vertexShader, fragmentShader);
ã·ã§ãŒããŒããã°ã©ã ããªã³ã¯ãããåŸãWebGLã«ããã䜿çšããããã«æç€ºããå¿ èŠããããŸãïŒ
gl.useProgram(shaderProgram);
ãããŠãuniform倿°ãšattributeãèšå®ã§ããŸãïŒ
const uModelViewProjectionMatrixLocation = gl.getUniformLocation(shaderProgram, 'u_modelViewProjectionMatrix');
const aPositionLocation = gl.getAttribLocation(shaderProgram, 'a_position');
å¹ççãªã·ã§ãŒããŒããã°ã©ã 管çã®éèŠæ§
ã·ã§ãŒããŒããã°ã©ã éã®åãæ¿ãã¯ãæ¯èŒçé«ã³ã¹ããªæäœã«ãªãå¯èœæ§ããããŸããgl.useProgram()ãåŒã³åºããã³ã«ãGPUã¯æ°ããã·ã§ãŒããŒããã°ã©ã ã䜿çšããããã«ãã€ãã©ã€ã³ãåèšå®ããå¿
èŠããããŸããããã¯ãç¹ã«å€ãã®ç°ãªããããªã¢ã«ãèŠèŠå¹æãæã€ã·ãŒã³ã§ãããã©ãŒãã³ã¹ã®ããã«ããã¯ãåŒãèµ·ããå¯èœæ§ããããŸãã
ç°ãªããã£ã©ã¯ã¿ãŒã¢ãã«ãããããããããç¬èªã®ãããªã¢ã«ïŒäŸïŒåžãéå±ãèïŒãæã€ã²ãŒã ãèããŠã¿ãŸããããåãããªã¢ã«ãå¥ã ã®ã·ã§ãŒããŒããã°ã©ã ãå¿ èŠãšããå Žåããããã®ããã°ã©ã ãé »ç¹ã«åãæ¿ããããšã¯ãã¬ãŒã ã¬ãŒãã«å€§ããªåœ±é¿ãäžããå¯èœæ§ããããŸããåæ§ã«ãç°ãªãããŒã¿ã»ãããæ§ã ãªèŠèŠã¹ã¿ã€ã«ã§ã¬ã³ããªã³ã°ãããããŒã¿å¯èŠåã¢ããªã±ãŒã·ã§ã³ã§ã¯ãã·ã§ãŒããŒåãæ¿ãã®ããã©ãŒãã³ã¹ã³ã¹ãããç¹ã«è€éãªããŒã¿ã»ãããé«è§£å床ãã£ã¹ãã¬ã€ã§é¡èã«ãªãããšããããŸããããã©ãŒãã³ã¹ã®é«ãWebGLã¢ããªã±ãŒã·ã§ã³ã®éµã¯ãå€ãã®å Žåãã·ã§ãŒããŒããã°ã©ã ãå¹ççã«ç®¡çããããšã«ãããŸãã
ãã«ãã·ã§ãŒããŒããã°ã©ã ã¢ã»ã³ããªïŒæé©åã®ããã®æŠç¥
ãã«ãã·ã§ãŒããŒããã°ã©ã ã¢ã»ã³ããªã¯ãè€æ°ã®ã·ã§ãŒããŒããªãšãŒã·ã§ã³ãåäžã®ããŠãŒããŒã·ã§ãŒããŒãããã°ã©ã ã«çµã¿åãããããšã§ãã·ã§ãŒããŒããã°ã©ã ã®åãæ¿ãåæ°ãæžããããšãç®çãšããæè¡ã§ãããã®ãŠãŒããŒã·ã§ãŒããŒã¯ãããŸããŸãªã¬ã³ããªã³ã°ã·ããªãªã«å¿ èŠãªãã¹ãŠã®ããžãã¯ãå«ã¿ãuniform倿°ã䜿çšããŠã·ã§ãŒããŒã®ã©ã®éšåãã¢ã¯ãã£ãã«ããããå¶åŸ¡ããŸãããã®æè¡ã¯åŒ·åã§ãããããã©ãŒãã³ã¹ã®äœäžãé¿ããããã«æ éã«å®è£ ããå¿ èŠããããŸãã
ãã«ãã·ã§ãŒããŒããã°ã©ã ã¢ã»ã³ããªã®ä»çµã¿
åºæ¬çãªèãæ¹ã¯ãè€æ°ã®ç°ãªãã¬ã³ããªã³ã°ã¢ãŒããåŠçã§ããã·ã§ãŒããŒããã°ã©ã ãäœæããããšã§ããããã¯ãæ¡ä»¶æïŒäŸïŒifãelseïŒãšuniform倿°ã䜿çšããŠãã©ã®ã³ãŒããã¹ãå®è¡ãããããå¶åŸ¡ããããšã«ãã£ãŠå®çŸãããŸããããã«ãããã·ã§ãŒããŒããã°ã©ã ãåãæ¿ããããšãªããç°ãªããããªã¢ã«ãèŠèŠå¹æãã¬ã³ããªã³ã°ã§ããŸãã
ãããç°¡åãªäŸã§èª¬æããŸãããããªããžã§ã¯ããæ¡æ£å ãŸãã¯é¡é¢åå°å ã®ããããã§ã¬ã³ããªã³ã°ããããšããŸãã2ã€ã®å¥ã ã®ã·ã§ãŒããŒããã°ã©ã ãäœæãã代ããã«ãäž¡æ¹ããµããŒãããåäžã®ããã°ã©ã ãäœæã§ããŸãïŒ
é ç¹ã·ã§ãŒããŒïŒå ±éïŒïŒ
#version 300 es
in vec4 a_position;
in vec3 a_normal;
uniform mat4 u_modelViewProjectionMatrix;
uniform mat4 u_modelViewMatrix;
uniform mat4 u_normalMatrix;
out vec3 v_normal;
out vec3 v_position;
void main() {
gl_Position = u_modelViewProjectionMatrix * a_position;
v_position = vec3(u_modelViewMatrix * a_position);
v_normal = normalize(vec3(u_normalMatrix * vec4(a_normal, 0.0)));
}
ãã©ã°ã¡ã³ãã·ã§ãŒããŒïŒãŠãŒããŒã·ã§ãŒããŒïŒïŒ
#version 300 es
precision highp float;
in vec3 v_normal;
in vec3 v_position;
uniform vec3 u_lightDirection;
uniform vec3 u_diffuseColor;
uniform vec3 u_specularColor;
uniform float u_shininess;
uniform bool u_useSpecular;
out vec4 fragColor;
void main() {
vec3 normal = normalize(v_normal);
vec3 lightDir = normalize(u_lightDirection);
float diffuse = max(dot(normal, lightDir), 0.0);
vec3 diffuseColor = diffuse * u_diffuseColor;
vec3 specularColor = vec3(0.0);
if (u_useSpecular) {
vec3 viewDir = normalize(-v_position);
vec3 reflectDir = reflect(-lightDir, normal);
float specular = pow(max(dot(viewDir, reflectDir), 0.0), u_shininess);
specularColor = specular * u_specularColor;
}
fragColor = vec4(diffuseColor + specularColor, 1.0);
}
ãã®äŸã§ã¯ãu_useSpecularãšããuniform倿°ãé¡é¢åå°å
ãæå¹ã«ãããã©ãããå¶åŸ¡ããŸããu_useSpecularãtrueã«èšå®ãããŠããå Žåãé¡é¢åå°å
ã®èšç®ãå®è¡ãããŸãããã以å€ã®å Žåã¯ã¹ããããããŸããæ£ããuniformãèšå®ããããšã§ãã·ã§ãŒããŒããã°ã©ã ã倿Žããããšãªããæ¡æ£å
ãšé¡é¢åå°å
ã广çã«åãæ¿ããããšãã§ããŸãã
ãã«ãã·ã§ãŒããŒããã°ã©ã ã¢ã»ã³ããªã®å©ç¹
- ã·ã§ãŒããŒããã°ã©ã ã®åãæ¿ãåæ°ã®åæžïŒ äž»ãªå©ç¹ã¯
gl.useProgram()åŒã³åºãã®åæ°ãæžãããšã§ããããã«ãããç¹ã«è€éãªã·ãŒã³ãã¢ãã¡ãŒã·ã§ã³ãã¬ã³ããªã³ã°ããéã®ããã©ãŒãã³ã¹ãåäžããŸãã - ç¶æ 管çã®ç°¡çŽ åïŒ äœ¿çšããã·ã§ãŒããŒããã°ã©ã ãå°ãªããšãã¢ããªã±ãŒã·ã§ã³ã®ç¶æ 管çãç°¡åã«ãªããŸããè€æ°ã®ã·ã§ãŒããŒããã°ã©ã ãšããã«é¢é£ããuniformã远跡ãã代ããã«ãåäžã®ãŠãŒããŒã·ã§ãŒããŒããã°ã©ã ã管çããã ãã§æžã¿ãŸãã
- ã³ãŒãåå©çšã®å¯èœæ§ïŒ ãã«ãã·ã§ãŒããŒããã°ã©ã ã¢ã»ã³ããªã¯ãã·ã§ãŒããŒå ã§ã®ã³ãŒãã®åå©çšãä¿é²ããŸããå ±éã®èšç®ã颿°ãç°ãªãã¬ã³ããªã³ã°ã¢ãŒãéã§å ±æã§ãããããã³ãŒãã®éè€ãæžããä¿å®æ§ãåäžããŸãã
ãã«ãã·ã§ãŒããŒããã°ã©ã ã¢ã»ã³ããªã®èª²é¡
ãã«ãã·ã§ãŒããŒããã°ã©ã ã¢ã»ã³ããªã¯å€§ããªããã©ãŒãã³ã¹äžã®å©ç¹ãæäŸã§ããŸãããããã€ãã®èª²é¡ããããããŸãïŒ
- ã·ã§ãŒããŒã®è€éæ§ã®å¢å ïŒ ãŠãŒããŒã·ã§ãŒããŒã¯ãç¹ã«ã¬ã³ããªã³ã°ã¢ãŒãã®æ°ãå¢ããã«ã€ããŠãè€éã§ä¿å®ãå°é£ã«ãªãå¯èœæ§ããããŸããæ¡ä»¶ããžãã¯ãšuniform倿°ã®ç®¡çã¯ãããã«æã«è² ããªããªãããšããããŸãã
- ããã©ãŒãã³ã¹ã®ãªãŒããŒãããïŒ ã·ã§ãŒããŒå ã®æ¡ä»¶æã¯ãGPUãå®éã«ã¯å¿ èŠã®ãªãã³ãŒããã¹ãå®è¡ããå¿ èŠããããããããã©ãŒãã³ã¹ã®ãªãŒããŒããããåŒãèµ·ããå¯èœæ§ããããŸããã·ã§ãŒããŒåãæ¿ãã®åæžã«ããå©ç¹ããæ¡ä»¶ä»ãå®è¡ã®ã³ã¹ããäžåãããšã確èªããããã«ãã·ã§ãŒããŒããããã¡ã€ãªã³ã°ããããšãéèŠã§ããçŸä»£ã®GPUã¯åå²äºæž¬ã«åªããŠãããããããã¯ããçšåºŠç·©åãããŸãããããã§ãèæ ®ããããšãéèŠã§ãã
- ã·ã§ãŒããŒã®ã³ã³ãã€ã«æéïŒ å€§ããè€éãªãŠãŒããŒã·ã§ãŒããŒãã³ã³ãã€ã«ããã«ã¯ãè€æ°ã®å°ããªã·ã§ãŒããŒãã³ã³ãã€ã«ãããããæéããããå ŽåããããŸããããã¯ãã¢ããªã±ãŒã·ã§ã³ã®åæããŒãæéã«åœ±é¿ãäžããå¯èœæ§ããããŸãã
- Uniformã®å¶éïŒ WebGLã·ã§ãŒããŒã§äœ¿çšã§ããuniform倿°ã®æ°ã«ã¯å¶éããããŸããããŸãã«ãå€ãã®æ©èœãçµã¿èŸŒãããšãããŠãŒããŒã·ã§ãŒããŒã¯ããã®å¶éãè¶ ããå¯èœæ§ããããŸãã
ãã«ãã·ã§ãŒããŒããã°ã©ã ã¢ã»ã³ããªã®ãã¹ããã©ã¯ãã£ã¹
ãã«ãã·ã§ãŒããŒããã°ã©ã ã¢ã»ã³ããªã广çã«äœ¿çšããã«ã¯ã次ã®ãã¹ããã©ã¯ãã£ã¹ãèæ ®ããŠãã ããïŒ
- ã·ã§ãŒããŒããããã¡ã€ãªã³ã°ããïŒ ãã«ãã·ã§ãŒããŒããã°ã©ã ã¢ã»ã³ããªãå®è£ ããåã«ãæ¢åã®ã·ã§ãŒããŒããããã¡ã€ãªã³ã°ããŠãæœåšçãªããã©ãŒãã³ã¹ã®ããã«ããã¯ãç¹å®ããŸããWebGLãããã¡ã€ãªã³ã°ããŒã«ã䜿çšããŠãã·ã§ãŒããŒããã°ã©ã ã®åãæ¿ããããŸããŸãªã·ã§ãŒããŒã³ãŒããã¹ã®å®è¡ã«è²»ããããæéãæž¬å®ããŸããããã«ããããã«ãã·ã§ãŒããŒããã°ã©ã ã¢ã»ã³ããªãã¢ããªã±ãŒã·ã§ã³ã«é©ããæé©åæŠç¥ã§ãããã©ããã倿ã§ããŸãã
- ã·ã§ãŒããŒãã¢ãžã¥ãŒã«åããïŒ ãŠãŒããŒã·ã§ãŒããŒã䜿çšããå Žåã§ããã¢ãžã¥ãŒã«æ§ãç®æããŠãã ãããã·ã§ãŒããŒã³ãŒããããå°ãããåå©çšå¯èœãªé¢æ°ã«åå²ããŸããããã«ãããã·ã§ãŒããŒã®çè§£ãä¿å®ããããã°ã容æã«ãªããŸãã
- Uniformãè³¢ã䜿çšããïŒ ãŠãŒããŒã·ã§ãŒããŒã§äœ¿çšããuniform倿°ã®æ°ãæå°éã«æããŸããé¢é£ããuniform倿°ãæ§é äœã«ã°ã«ãŒãåããŠãå šäœã®æ°ãæžãããŸããuniformã®ä»£ããã«ãã¯ã¹ãã£ã«ãã¯ã¢ããã䜿çšããŠå€§éã®ããŒã¿ãä¿åããããšãæ€èšããŠãã ããã
- æ¡ä»¶ããžãã¯ãæå°åããïŒ ã·ã§ãŒããŒå
ã®æ¡ä»¶ããžãã¯ã®éãæžãããŸããè€éãª
if/elseæã«é Œãã®ã§ã¯ãªããuniform倿°ã䜿çšããŠã·ã§ãŒããŒã®åäœãå¶åŸ¡ããŸããå¯èœã§ããã°ãJavaScriptã§å€ãäºåèšç®ããuniformãšããŠã·ã§ãŒããŒã«æž¡ããŸãã - ã·ã§ãŒããŒããªã¢ã³ããæ€èšããïŒ å Žåã«ãã£ãŠã¯ãåäžã®ãŠãŒããŒã·ã§ãŒããŒãäœæããããããè€æ°ã®ã·ã§ãŒããŒããªã¢ã³ããäœæããæ¹ãå¹ççãªããšããããŸããã·ã§ãŒããŒããªã¢ã³ãã¯ãç¹å®ã®ã¬ã³ããªã³ã°ã·ããªãªã«åãããŠæé©åãããã·ã§ãŒããŒããã°ã©ã ã®ç¹æ®ãªããŒãžã§ã³ã§ãããã®ã¢ãããŒãã«ãããã·ã§ãŒããŒã®è€éãã軜æžãããããã©ãŒãã³ã¹ãåäžããŸããããªããã»ããµã䜿çšããŠããã«ãæã«ããªã¢ã³ããèªåçã«çæããã³ãŒããä¿å®ããŸãã
- #ifdefã¯æ³šæããŠäœ¿çšããïŒ #ifdefã¯ã³ãŒãã®äžéšãåãæ¿ããããã«äœ¿çšã§ããŸãããifdefã®å€ã倿Žããããšã·ã§ãŒããŒãåã³ã³ãã€ã«ããããããããã©ãŒãã³ã¹äžã®æžå¿µããããŸãã
å®äžçã®äŸ
ããã€ãã®äººæ°ã®ããã²ãŒã ãšã³ãžã³ãã°ã©ãã£ãã¯ã¹ã©ã€ãã©ãªã¯ãã¬ã³ããªã³ã°ããã©ãŒãã³ã¹ãæé©åããããã«ãã«ãã·ã§ãŒããŒããã°ã©ã ã¢ã»ã³ããªæè¡ã䜿çšããŠããŸããäŸãã°ïŒ
- Unity: Unityã®Standard Shaderã¯ãå¹ åºããããªã¢ã«ããããã£ãšã©ã€ãã£ã³ã°æ¡ä»¶ãåŠçããããã«ãŠãŒããŒã·ã§ãŒããŒã¢ãããŒããå©çšããŠããŸããå éšçã«ã¯ããŒã¯ãŒãä»ãã®ã·ã§ãŒããŒããªã¢ã³ãã䜿çšããŠããŸãã
- Unreal Engine: Unreal EngineããããŸããŸãªãããªã¢ã«ã®ããªãšãŒã·ã§ã³ãã¬ã³ããªã³ã°æ©èœã管çããããã«ããŠãŒããŒã·ã§ãŒããŒãšã·ã§ãŒããŒã®é åã䜿çšããŠããŸãã
- Three.js: Three.jsã¯æç€ºçã«ãã«ãã·ã§ãŒããŒããã°ã©ã ã¢ã»ã³ããªã匷å¶ããŸããããéçºè ãã«ã¹ã¿ã ã·ã§ãŒããŒãäœæããã¬ã³ããªã³ã°ããã©ãŒãã³ã¹ãæé©åããããã®ããŒã«ãšæè¡ãæäŸããŸããã«ã¹ã¿ã ãããªã¢ã«ãšshaderMaterialã䜿çšããããšã§ãéçºè ã¯äžèŠãªã·ã§ãŒããŒåãæ¿ããé¿ããã«ã¹ã¿ã ã·ã§ãŒããŒããã°ã©ã ãäœæã§ããŸãã
ãããã®äŸã¯ãå®äžçã®ã¢ããªã±ãŒã·ã§ã³ã«ããããã«ãã·ã§ãŒããŒããã°ã©ã ã¢ã»ã³ããªã®å®çšæ§ãšæå¹æ§ã瀺ããŠããŸãããã®èšäºã§æŠèª¬ãããååãšãã¹ããã©ã¯ãã£ã¹ãçè§£ããããšã§ããã®æè¡ã掻çšããŠç¬èªã®WebGLãããžã§ã¯ããæé©åããèŠèŠçã«èŠäºã§ããã©ãŒãã³ã¹ã®é«ãäœéšãåµé ããããšãã§ããŸãã
é«åºŠãªãã¯ããã¯
åºæ¬çãªååãè¶ ããŠãããã€ãã®é«åºŠãªãã¯ããã¯ããã«ãã·ã§ãŒããŒããã°ã©ã ã¢ã»ã³ããªã®å¹æãããã«é«ããããšãã§ããŸãïŒ
ã·ã§ãŒããŒã®äºåã³ã³ãã€ã«
ã·ã§ãŒããŒãäºåã³ã³ãã€ã«ããããšã§ãã¢ããªã±ãŒã·ã§ã³ã®åæããŒãæéãå€§å¹ ã«ççž®ã§ããŸããå®è¡æã«ã·ã§ãŒããŒãã³ã³ãã€ã«ãã代ããã«ããªãã©ã€ã³ã§ã³ã³ãã€ã«ããã³ã³ãã€ã«ããããã€ãã³ãŒããä¿åã§ããŸããã¢ããªã±ãŒã·ã§ã³ã®èµ·åæã«ãäºåã³ã³ãã€ã«ãããã·ã§ãŒããŒãçŽæ¥ããŒãã§ããã³ã³ãã€ã«ã®ãªãŒããŒããããåé¿ã§ããŸãã
ã·ã§ãŒããŒã®ãã£ãã·ã³ã°
ã·ã§ãŒããŒã®ãã£ãã·ã³ã°ã¯ãã·ã§ãŒããŒã®ã³ã³ãã€ã«åæ°ãæžããã®ã«åœ¹ç«ã¡ãŸããã·ã§ãŒããŒãã³ã³ãã€ã«ããããšãã³ã³ãã€ã«ããããã€ãã³ãŒãã¯ãã£ãã·ã¥ã«ä¿åã§ããŸããåãã·ã§ãŒããŒãååºŠå¿ èŠã«ãªã£ãå Žåãåã³ã³ãã€ã«ãã代ããã«ãã£ãã·ã¥ããååŸã§ããŸãã
GPUã€ã³ã¹ã¿ã³ã·ã³ã°
GPUã€ã³ã¹ã¿ã³ã·ã³ã°ã䜿çšãããšãåããªããžã§ã¯ãã®è€æ°ã®ã€ã³ã¹ã¿ã³ã¹ãåäžã®æç»ã³ãŒã«ã§ã¬ã³ããªã³ã°ã§ããŸããããã«ãããæç»ã³ãŒã«ã®æ°ãå€§å¹ ã«åæžããããã©ãŒãã³ã¹ãåäžãããããšãã§ããŸãããã«ãã·ã§ãŒããŒããã°ã©ã ã¢ã»ã³ããªã¯ãGPUã€ã³ã¹ã¿ã³ã·ã³ã°ãšçµã¿åãããŠãã¬ã³ããªã³ã°ããã©ãŒãã³ã¹ãããã«æé©åããããšãã§ããŸãã
é å»¶ã·ã§ãŒãã£ã³ã°
é å»¶ã·ã§ãŒãã£ã³ã°ã¯ãã©ã€ãã£ã³ã°èšç®ããžãªã¡ããªã¬ã³ããªã³ã°ããåé¢ããã¬ã³ããªã³ã°æè¡ã§ããããã«ãããã·ãŒã³å ã®ã©ã€ãã®æ°ã«å¶éãããããšãªããè€éãªã©ã€ãã£ã³ã°èšç®ãå®è¡ã§ããŸãããã«ãã·ã§ãŒããŒããã°ã©ã ã¢ã»ã³ããªã䜿çšããŠãé å»¶ã·ã§ãŒãã£ã³ã°ãã€ãã©ã€ã³ãæé©åã§ããŸãã
çµè«
WebGLã·ã§ãŒããŒããã°ã©ã ã®ãªã³ã¯ã¯ããŠã§ãäžã§3Dã°ã©ãã£ãã¯ã¹ãäœæããäžã§ã®åºæ¬çãªåŽé¢ã§ããã·ã§ãŒããŒãã©ã®ããã«äœæãã³ã³ãã€ã«ããªã³ã¯ãããããçè§£ããããšã¯ãã¬ã³ããªã³ã°ããã©ãŒãã³ã¹ãæé©åããè€éãªèŠèŠå¹æãäœæããããã«äžå¯æ¬ ã§ãããã«ãã·ã§ãŒããŒããã°ã©ã ã¢ã»ã³ããªã¯ãã·ã§ãŒããŒããã°ã©ã ã®åãæ¿ãåæ°ãæžãããããã©ãŒãã³ã¹ã®åäžãšç¶æ 管çã®ç°¡çŽ åã«ã€ãªãã匷åãªæè¡ã§ãããã®èšäºã§æŠèª¬ããããã¹ããã©ã¯ãã£ã¹ã«åŸãã課é¡ãèæ ®ããããšã§ããã«ãã·ã§ãŒããŒããã°ã©ã ã¢ã»ã³ããªã广çã«æŽ»çšããäžçäžã®èŠèŽè ã«åããŠèŠèŠçã«èŠäºã§ããã©ãŒãã³ã¹ã®é«ãWebGLã¢ããªã±ãŒã·ã§ã³ãäœæããããšãã§ããŸãã
æåã®ã¢ãããŒãã¯ãã¢ããªã±ãŒã·ã§ã³ã®ç¹å®ã®èŠä»¶ã«äŸåããããšãå¿ããªãã§ãã ãããã³ãŒãããããã¡ã€ãªã³ã°ããããŸããŸãªãã¯ããã¯ã詊ããåžžã«ããã©ãŒãã³ã¹ãšã³ãŒãã®ä¿å®æ§ã®ãã©ã³ã¹ãåãããã«åªããŠãã ããã